package uestc.lj.basic.graph;

/**
 * 将一个二维矩阵转换成我自己定义的图的格式
 *
 * @Author:Crazlee
 * @Date:2021/11/24
 */
public class GraphGenerator {

	/**
	 * 创建自己定义的图
	 * 这里的二维矩阵（N*3）代表含义是：
	 * matrix[0]——代表边的起点
	 * matrix[1]——代表边的终点
	 * matrix[2]——代表边的权值
	 *
	 * @param matrix 二维矩阵
	 * @return 图结构
	 */
	public static Graph createGraph(Integer[][] matrix) {
		Graph graph = new Graph();
		for (int i = 0; i < matrix.length; i++) {
			Integer from = matrix[i][0];
			Integer to = matrix[i][1];
			Integer weight = matrix[i][2];
			//判断当前起点城市之前是否出现过
			if (!graph.nodes.containsKey(from)) {
				graph.nodes.put(from, new Node(from));
			}
			//判断当前终点城市之前是否出现过
			if (!graph.nodes.containsKey(to)) {
				graph.nodes.put(to, new Node(to));
			}
			//构建点所对应的边
			Node fromNode = graph.nodes.get(from);
			Node toNode = graph.nodes.get(to);
			Edge edge = new Edge(weight, fromNode, toNode);
			//修改点中的属性
			// 1.from点到to点
			fromNode.nexts.add(toNode);
			// 2.from点的出度
			fromNode.out++;
			// 3.to点的入度
			toNode.in++;
			// 4.属于from点的边
			fromNode.edges.add(edge);
			//整个图中的边
			graph.edges.add(edge);
		}
		return graph;
	}
}
